iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 22
2
Modern Web

30天打造我的WebGIS系列 第 22

[Day 22] WebGIS中加入Google Directions導航API

  • 分享至 

  • xImage
  •  

前言

今天要來接Google路徑導航資訊,Google Maps API有很多很棒的東西可以用在WebGIS,路徑規劃就是其中之一,他的完整名稱是Directions API,把它整合進我們的地圖。

申請token

使用Google API都要申請token,這邊偷懶地簡單說明一下:
首先打開Directions API,按右上角取得金鑰

然後選取一個專案(如果沒有要另外開啟)。

之後就會取得一組金鑰,這就是token。

我們關注一下免費版的使用限制,注意不是完全免費的喔。

  • 每日免費要求提供上限為 2,500 個。
  • 如果啟用計費功能,則每 1,000 個額外要求收費 $0.50 美元,每日提供上限為 100,000 個。

try it

使用Direction API取得路徑規劃的方式可以用get的方式,
最簡單的使用:

https://maps.googleapis.com/maps/api/directions/json?language=zh-TW&origin=" + **start** + "&destination=" + **end** + "&key=" + **token**

request有幾個必填項目,

  • key: 金鑰token(如果是在client端使用記得要設定存取domain)
  • origin: 起點,起終點都可以使用wgs84坐標或是地標名稱
  • destination: 終點

此外,Direction API有提供很多選填,包含

  • language: 語言
  • mode: 移動模式(預設為 driving)
  • region: 指定地區代碼
  • more..
    Google DirectionAPI可以設定的參數很多,包含避開路線、替代路線等等,有需要者可以詳閱API文件

我們就直接request一個看Direction API回應些什麼..

整個回應的資料十分豐富,包含旅行時間、路徑等等,我們可以把這些資訊使用在圖台上!

解析資料

1.overview_polyline

從回應的資料可以看到overview_polyline,這是一個經過編碼的路線陣列,記錄的是API規劃的路徑及沿線polyline的預覽,我們可以把它畫在圖上,而編碼的方法請參閱Google文件

要使用overview_polyline這類的編碼資料,可以引入Leaflet.encoded,利用這個工具解碼

 var latlngs = L.PolylineUtil.decode(str);

解碼後就是一個polyline的資料,可以直接用polyline放到圖上

L.polyline(latlngs, { color: 'red' }).addTo(map);

2.steps

API回傳的資料很多,其中steps是分段的路徑資訊,我們直接取steps這個陣列來使用,steps裡面包的就是一段一段的轉折點,除了幾何外,還包含了導航文字說明。

展開:

我們就組個表格,並把文字說明html_instructions塞入:

//data為api responds資料
  $.each(data.routes[0].legs[0].steps, function (k, v) {

    $("#route-list tbody").append("<tr id='" + v.polyline.points + "' class='route-row'><td>" + v.html_instructions + "</td></tr>");

  })

接著,綁定每段的click事件,使用者點到以後就可以顯示每小段的位置,其中在幾何部分我們使用一樣工具解碼喔!

$(document).on("click", ".route-row", function (e) {
  $('#googleRouting').animate({ scrollTop: $(this).context.offsetTop }, 800);
  routelineClick($(this).attr("id"));

});

var subRoute = L.geoJson(null);
function routelineClick(str) {
  map.removeLayer(subRoute);
  var latlngs = L.PolylineUtil.decode(str);
  subRoute = L.polyline(latlngs, { color: 'red' }).addTo(map);
  map.setView([latlngs[0][0] - 0.001, latlngs[0][1]], 17)
}

切版及成果

為了加入導航的功能,所以今天地圖增加了bottom區塊,有興趣者就自行研究吧,最終的效果如下:

後記

今天快速測試一下Google Direction,很好用但是不是完全免費的,而類似的服務還有MapboxHere Routing API,OSM社群也有一些開源的服務,有機會再詳細介紹吧!

今天的測試程式碼一樣放在github(day22的commit)。


上一篇
[Day 21] 在WebGIS加入風場圖
下一篇
[Day 23] 在WebGIS中加入Google街景
系列文
30天打造我的WebGIS30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
小魚
iT邦大師 1 級 ‧ 2019-06-27 10:36:52

不好意思我想問一下,
有辦法改變起點跟終點的點擊事件嗎?
目前針對自定義點的點擊可以處理,
但找不到路線規劃回傳的起點和終點要在哪邊修改,

另外會有位置偏移的情況,
https://ithelp.ithome.com.tw/upload/images/20190627/20105694ba5Eh2XYGr.png
如圖A跟B是路線規劃回傳的結果,
A是起點B是終點,
旁邊的兩個點是直接把起點跟終點Mark的結果,
不知道有沒有遇過這樣的情況,
有解決的方式嗎?
感恩~
/images/emoticon/emoticon41.gif

我要留言

立即登入留言